package com.richpay.basejava.base21.part1;

/**
 * 在Java中创建多线程的方式有两种：
 * A:继承Thread类并重写Thread类中的run()方法
 * 1.编写一个子类MyThread继承 Thread并重写Thread类的run()方法
 * public class MyThread extends Thread{
 * 子线程代码的执行区域
 * public void run(){
 * 运行在子线程中的代码
 * }
 * }
 * 2.实例化线程的子类对象MyThread
 * MyThread mt=new MyThread();
 * 3.调用子类对象MyThread的start()开启子线程执行子线程中run()方法中的代码
 * mt.start();
 * B:实现Runnable接口
 * 1.编写一个子类实现Runnable接口并重写Runnable接口中唯一的方法run()方法
 * public class MyRunnable implements Runnable{
 * 子线程代码的执行区域
 * public void run(){
 * 运行在子线程中的代码
 * }
 * }
 * 2.实例化实现Runnable接口的子类对象MyRunnable
 * MyRunnable mr=new MyRunnable();
 * 3.实例化Thread对象并传递实现Runnable接口的子类对象mr
 * Thread t=new Thread(mr);
 * 4.开启子线程
 * t.start();
 * 多线程的执行具有不确定性，这是由于CPU的切换造成的.
 */
public class ThreadStart {
    public static void main(String[] args) {
        // 1.实例化线程的子类对象
        MyThread myThread = new MyThread();
        /** 2.调用线程对象的start()方法开启子线程
         *
         * 调用完start()方法后只能说明当前线程处于可运行状态(当前线程具有执行资格，但没有执行权)，
         * 并不保证马上会执行子线程区域中的代码，这要看CPU的执行情况,如果正好调用完start()方法后
         * 当前main线程的CPU时间片正好用完并且CUP下一个时刻正好选中了子线程，则才会马上执行子线程中的代码.
         *
         *
         * 注意：开启子线程必须调用start()方法，不能直接调用run()方法，否则就成了普通的方法调用，不能开启子线程了，为什么？
         *
         * 因为调用start()方法做了两件事：
         * 	A:开启子线程(java调用操作系统即C语言中编写好的代码开启子线程)
         *  B:调用run()执行自己需要执行的业务代码.
         */
        //myThread.start();

        //同一个线程对象不能多次开启，否则报 java.lang.IllegalThreadStateException异常
        myThread.run();

        //myThread.run();//开启不了子线程，成了普通的方法调用
        //证明就是按照顺序执行的 如最下方是输出结果所示
        for (int i = 0; i < 10; i++) {
            String name = Thread.currentThread().getName();
            System.out.println(name + "====>" + i);
        }

    }
    /**
     * 真正的子线程
     *
     * main====>0
     * Thread-0====>0
     * main====>1
     * Thread-0====>1
     * Thread-0====>2
     * main====>2
     * main====>3
     * main====>4
     * main====>5
     * main====>6
     * Thread-0====>3
     * Thread-0====>4
     * Thread-0====>5
     * main====>7
     * Thread-0====>6
     * Thread-0====>7
     * Thread-0====>8
     * Thread-0====>9
     * main====>8
     * main====>9
     */

    /**
     * 普通方法
     *
     * Thread-0====>0
     * Thread-0====>1
     * Thread-0====>2
     * Thread-0====>3
     * Thread-0====>4
     * Thread-0====>5
     * Thread-0====>6
     * Thread-0====>7
     * Thread-0====>8
     * Thread-0====>9
     * main====>0
     * main====>1
     * main====>2
     * main====>3
     * main====>4
     * main====>5
     * main====>6
     * main====>7
     * main====>8
     * main====>9
     */
}
